#include "ModRunStrategy.h"
#include <QDebug>

#include "../Output/FactoryOutput.h"

#include "Gof23/Gof_Strategy/Context.h"
#include "Gof23/Gof_Strategy/CustomerFewStrategy.h"
#include "Gof23/Gof_Strategy/CustomerManyStrategy.h"
#include "Gof23/Gof_Strategy/OldCustomerFewStrategy.h"
#include "Gof23/Gof_Strategy/OldCustomerManyStrategy.h"

//策略模式的ModRun（Strategy）;
ModRunStrategy::ModRunStrategy()
{
    //模式名称;
    m_strModelName = "策略模式（Strategy）;";
    //模式描述;
    m_strModelDesc = "策略模式是指定义一系列的算法，把它们单独封装起来，并且使它们可以互相替换，使得算法可以独立于使用它的客户端而变化，\r\n"
                     "也是说这些算法所完成的功能类型是一样的，对外接口也是一样的，只是不同的策略为引起环境角色表现出不同的行为。\r\n"
                     "相比于使用大量的if…else，使用策略模式可以降低复杂度，使得代码更容易维护。\r\n"
                     "缺点：可能需要定义大量的策略类，并且这些策略类都要提供给客户端。\r\n"
                     ;
}

//初始化显示模式;
void ModRunStrategy::InitDisplay()
{
    qDebug() << m_strModelName;
    std::shared_ptr<IOutput> pOutPut = FactoryOutput::GetInstance()->CreateDescOutput();
    if (pOutPut)
    {
        std::initializer_list<QString> outList{ m_strModelName,m_strModelDesc};
        pOutPut->OutPut(outList);
    }
}

//返回模式类型;
EnumModRun ModRunStrategy::GetEnum()
{
    return emModRunStrategy;
}

//运行模式;
void ModRunStrategy::ModRun()
{
    std::shared_ptr<IOutput> pOutPut = FactoryOutput::GetInstance()->CreateRunOutput();
    if (pOutPut)
    {
        std::initializer_list<QString> outListStart{ "========策略模式 start:=======" };
        std::initializer_list<QString> outListEnd{ "========策略模式 end:=======" };
        pOutPut->OutPut(outListStart);

        //策略模式;
        std::shared_ptr<CustomerFewStrategy> strategyCF(new CustomerFewStrategy());
        std::shared_ptr<CustomerManyStrategy> strategyCM(new CustomerManyStrategy());
        std::shared_ptr<OldCustomerFewStrategy> strategyOCF(new OldCustomerFewStrategy());
        std::shared_ptr<OldCustomerManyStrategy> strategyOCM(new OldCustomerManyStrategy());

        double dPrice = 100.0;
        Context con;

        //普通用户小批量;
        con.SetStrategy(strategyCF);
        con.printPrice(dPrice);

        //普通用户大批量;
        con.SetStrategy(strategyCM);
        con.printPrice(dPrice);

        //老用户小批量;
        con.SetStrategy(strategyOCF);
        con.printPrice(dPrice);

        //老用户大批量;
        con.SetStrategy(strategyOCM);
        con.printPrice(dPrice);

        pOutPut->OutPut(outListEnd);
    }

}

InterFaceModRun* ModRunStrategy::CreateMe()
{
    return new ModRunStrategy();
}
